home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / NETFILE.PAS < prev    next >
Pascal/Delphi Source File  |  1996-04-20  |  10KB  |  368 lines

  1. UNIT NetFile;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ Share aware file routines                     Last changed: 20.04.96  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-94 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. USES Use32, Dos,
  16.      PoPTypes;
  17.  
  18. CONST
  19.   NoKeep = False;
  20.   Keep   = True;
  21.   NoWait = False;
  22.   Wait   = True;
  23.  
  24. CONST  { To Grab/Release File }
  25.   NetICFile = 0;
  26.   NetNLFile = 1;
  27.  
  28. TYPE
  29.   PNetFile = ^TNetFile;
  30.   TNetFile = OBJECT
  31.     f     : File;
  32.     NetIo : Integer;
  33.     FName : PathStr;
  34.  
  35.     CONSTRUCTOR OpenWithMode(CONST AFName: PathStr; ARecSize: Word; Create: Boolean; AMode: Word);
  36.     CONSTRUCTOR Open(CONST AFName: PathStr; ARecSize: Word; Create: Boolean);
  37.     DESTRUCTOR Close; VIRTUAL;
  38.     FUNCTION  IoResult: Integer;
  39.     FUNCTION  Lock(RecNum: LongInt; Wait: Boolean): Boolean;
  40.     PROCEDURE UnLock(RecNum: LongInt);
  41.     PROCEDURE GetRec(VAR Buffer; RecNum: LongInt; K,W: Boolean);
  42.     PROCEDURE PutRec(VAR Buffer; RecNum: LongInt);
  43.     PROCEDURE Read(VAR Buffer; K,W: Boolean);
  44.     PROCEDURE Write(VAR Buffer);
  45.     PROCEDURE BlockRead(VAR Buffer; Recs: Word);
  46.     PROCEDURE BlockReadNum(VAR Buffer; Recs: Word; VAR ActRecs: Word);
  47.     PROCEDURE ReadLine(VAR s: String);
  48.     PROCEDURE ReadLineBack(VAR s: String);
  49.     PROCEDURE BlockWrite(VAR Buffer; Recs: Word);
  50.     PROCEDURE WriteLine(s: String);
  51.     FUNCTION  FileSize: LongInt;
  52.     FUNCTION  FilePos: LongInt;
  53.     PROCEDURE Seek(RecNum: LongInt);
  54.     FUNCTION  EoF: Boolean;
  55.     PROCEDURE Truncate;
  56.     FUNCTION  RecSize: Word;
  57.     PROCEDURE CheckNetIo(CONST Where: S20);
  58.   END;
  59.  
  60. FUNCTION  NetGrabFile(FileNum: Byte): Boolean;
  61. PROCEDURE NetReleaseFile(FileNum: Byte);
  62. PROCEDURE OpenLockFile;
  63. PROCEDURE CloseLockFile;
  64.  
  65. IMPLEMENTATION
  66.  
  67. USES OpCrt, OpWindow, OpString, ApTimer,
  68.      Share, LogFile, OProUtil, Util, Globals, StrUtil;
  69.  
  70. VAR
  71.   LockFile : TNetFile;
  72.  
  73.   FUNCTION NetGrabFile(FileNum: Byte): Boolean;
  74.   BEGIN
  75.     NetGrabFile:=LockFile.Lock(FileNum, True);
  76.   END;
  77.  
  78.   PROCEDURE NetReleaseFile(FileNum: Byte);
  79.   BEGIN
  80.     LockFile.UnLock(FileNum);
  81.   END;
  82.  
  83.   PROCEDURE OpenLockFile;
  84.   VAR
  85.     i,j : Byte;
  86.   BEGIN
  87.     LockFile.Open(StartPath+PoPNetFileName, 1, True);
  88.     j:=0;
  89.     IF LockFile.FileSize<>32 THEN
  90.       FOR i:=LockFile.FileSize TO 31 DO
  91.         LockFile.PutRec(j,i);
  92.   END;
  93.  
  94.   PROCEDURE CloseLockFile;
  95.   BEGIN
  96.     LockFile.Close;
  97.   END;
  98.  
  99.  
  100.  
  101.   CONSTRUCTOR TNetFile.OpenWithMode(CONST AFName: PathStr; ARecSize: Word; Create: Boolean; AMode: Word);
  102.   VAR
  103.     Tries: Byte;
  104.   BEGIN
  105.     FName:=ReplaceEnv(AFName);
  106.     NetIo:=0;
  107.     IF InOutRes<>0 THEN AddLog('!','Untrapped I/O Error '+Long2Str(IOResult)+' before opening: '+FName);
  108.     Assign(f, FName); FileMode:=AMode;
  109.     Tries:=0;
  110.     REPEAT
  111.       Reset(f, ARecSize);
  112.       NetIo:=System.IoResult;
  113.       IF (NetIo=2) And (Create) THEN
  114.       BEGIN
  115.         ReWrite(f, ARecSize);
  116.         NetIo:=System.IoResult;
  117.         IF NetIo=5 THEN
  118.           NetIo:=18
  119.         ELSE
  120.         BEGIN
  121.           System.Close(f);
  122.           NetIo:=255;   { Try opening it now.... }
  123.         END;
  124.       END;
  125.       Inc(Tries);
  126.     UNTIL (NetIo IN [0,3,4]) OR ((NetIo=2) And Not Create) Or (Tries>=5);
  127.     IF (NetIO<>0) And (Tries>=5) And (Create) THEN
  128.       AddLog('!','I/O Error '+Long2Str(NetIo)+' when creating: '+FName);
  129.     IF NetIO=4 THEN AddLog('!', 'Too many open files - Increase FILES= in CONFIG.SYS');
  130.     IF NetIo<>0 THEN Fail;
  131.   END;
  132.  
  133.   CONSTRUCTOR TNetFile.Open(CONST AFName: PathStr; ARecSize: Word; Create: Boolean);
  134.   BEGIN
  135.     IF NOT TNetFile.OpenWithMode(AFName, ARecSize, Create, ShareRW+ShareDenyNone) THEN Fail;
  136.   END;
  137.  
  138.   DESTRUCTOR TNetFile.Close;
  139.   BEGIN
  140.     CheckNetIo('Close');
  141.     System.Close(f);
  142.   END;
  143.  
  144.   FUNCTION TNetFile.IoResult: Integer;
  145.   BEGIN
  146.     IoResult:=NetIo;
  147.     NetIo:=0;
  148.   END;
  149.  
  150.   FUNCTION TNetFile.Lock(RecNum: LongInt; Wait: Boolean): Boolean;
  151.   VAR
  152.     t : EventTimer;
  153.     i : Byte;
  154.     LockErr : Word;
  155.     WaitWin : WindowPtr;
  156.     NL : Boolean;
  157.   BEGIN
  158.     CheckNetIo('Lock');
  159.     NL:=Share.Lock(f, FileRec(f).RecSize*RecNum, FileRec(f).RecSize,LockErr);
  160.     IF NOT NL AND Wait THEN
  161.     BEGIN
  162.       MyWin(WaitWin,1,ScreenHeight-2,80,ScreenHeight,3,' Record locked ',False);
  163.       WaitWin^.wFastCenter(FName+', record '+Long2Str(RecNum),1,Cfg.Color[3].TextColor);
  164.       NewTimerSecs(t, 60);
  165.       REPEAT
  166.         Pause(200+(Cfg.TaskNumber*20));
  167.         NL:=Share.Lock(f, FileRec(f).RecSize*RecNum, FileRec(f).RecSize, LockErr);
  168.       UNTIL NL OR TimerExpired(t) OR GotESC;
  169.       IF NOT NL THEN AddLog(' ','Lock timeout on: '+FName+' ('+HexW(LockErr)+')');
  170.       KillWindow(WaitWin);
  171.     END;
  172.     Lock:=NL;
  173.   END;
  174.  
  175.   PROCEDURE TNetFile.UnLock(RecNum: LongInt);
  176.   BEGIN
  177.     CheckNetIo('UnLock');
  178.     Share.UnLock(f,FileRec(f).RecSize*RecNum,FileRec(f).RecSize);
  179.   END;
  180.  
  181.   PROCEDURE TNetFile.GetRec(VAR Buffer; RecNum: LongInt; K,W: Boolean);
  182.   BEGIN
  183.     CheckNetIo('GetRec');
  184.     Seek(RecNum);
  185.     NetIo:=System.IoResult;
  186.     IF NetIo<>0 THEN Exit;
  187.     IF NOT Lock(RecNum,W) THEN
  188.     BEGIN
  189.       NetIo:=107;
  190.       Exit;
  191.     END;
  192.     System.BlockRead(f,Buffer,1);
  193.     IF NOT K THEN UnLock(RecNum);
  194.     NetIo:=System.IoResult;
  195.   END;
  196.  
  197.   PROCEDURE TNetFile.PutRec(VAR Buffer; RecNum: LongInt);
  198.   BEGIN
  199.     CheckNetIo('PutRec');
  200.     Seek(RecNum);
  201.     NetIo:=System.IoResult;
  202.     IF NetIo=0 THEN
  203.     BEGIN
  204.       System.BlockWrite(f,Buffer,1);
  205.       UnLock(RecNum);
  206.       NetIo:=System.IoResult;
  207.     END;
  208.   END;
  209.  
  210.   PROCEDURE TNetFile.Read(VAR Buffer; K,W: Boolean);
  211.   BEGIN
  212.     CheckNetIo('Read');
  213.     IF EoF THEN
  214.     BEGIN
  215.       NetIo:=100;
  216.     END ELSE
  217.       IF NOT Lock(FilePos, W) THEN
  218.       BEGIN
  219.         IF W THEN Seek(FilePos+1);
  220.         InOutRes:=0;
  221.         NetIo:=107;
  222.       END ELSE
  223.       BEGIN
  224.         System.BlockRead(f, Buffer, 1);
  225.         IF NOT K THEN UnLock(FilePos-1);
  226.         NetIo:=System.IoResult;
  227.       END;
  228.   END;
  229.  
  230.   PROCEDURE TNetFile.Write(VAR Buffer);
  231.   BEGIN
  232.     CheckNetIo('Write');
  233.     System.BlockWrite(f, Buffer, 1);
  234.     UnLock(FilePos-1);
  235.     NetIo:=System.IoResult;
  236.   END;
  237.  
  238.   PROCEDURE TNetFile.BlockRead(VAR Buffer; Recs: Word);
  239.   BEGIN
  240.     CheckNetIo('BlockRead');
  241.     System.BlockRead(f, Buffer, Recs);
  242.     NetIo:=System.IoResult;
  243.   END;
  244.  
  245.   PROCEDURE TNetFile.BlockReadNum(VAR Buffer; Recs: Word; VAR ActRecs: Word);
  246.   BEGIN
  247.     CheckNetIo('BlockReadNum');
  248.     System.BlockRead(f, Buffer, Recs, ActRecs);
  249.     NetIo:=System.IoResult;
  250.   END;
  251.  
  252.   PROCEDURE TNetFile.ReadLine(VAR s: String);
  253.   VAR
  254.     OldPos : LongInt;
  255.     Buf    : Array[0..254] Of Char;
  256.     Test   : Word;
  257.     i      : Byte;
  258.   BEGIN
  259.     CheckNetIo('ReadLine');
  260.     S:='';
  261.     OldPos:=System.FilePos(f);
  262.     System.BlockRead(f, Buf, SizeOf(Buf), Test);
  263.     i:=0;
  264.     WHILE (Test<>0) And (i<Test) AND (Buf[i]<>#10) DO
  265.     BEGIN
  266.       IF (Buf[i]<>#10) AND (Buf[i]<>#13) THEN S:=S+Buf[i];
  267.       Inc(i);
  268.     END;
  269.     Seek(OldPos+i+1);
  270.     IF System.IoResult<>0 THEN ;
  271.   END;
  272.  
  273.   PROCEDURE TNetFile.ReadLineBack(VAR s: String);
  274.   VAR
  275.     x, OldPos : LongInt;
  276.     Buf       : Array[1..255] Of Char;
  277.     Test      : Integer;
  278.     i         : Byte;
  279.   BEGIN
  280.     CheckNetIo('ReadLineBack');
  281.     S:='';
  282.     OldPos:=System.FilePos(f);
  283.     If OldPos>SizeOf(buf) Then
  284.     BEGIN
  285.       System.Seek(f, OldPos-SizeOf(Buf)-3);
  286.       i:=SizeOf(buf);
  287.     END ELSE
  288.     BEGIN
  289.       System.Seek(f, 0);
  290.       i:=OldPos;
  291.     END;
  292.     System.BlockRead(f, Buf, i, Test);
  293.     WHILE (Test<>0) And (i>0) AND (Buf[i]<>#10) DO
  294.     BEGIN
  295.       IF (Buf[i]<>#10) AND (Buf[i]<>#13) THEN S:=Buf[i]+S;
  296.       Dec(i);
  297.     END;
  298.     x:=OldPos-Test+i-1;
  299.     IF x<0 THEN x:=0;
  300.     System.Seek(f, x);
  301.     IF System.IoResult<>0 THEN ;
  302.   END;
  303.  
  304.   PROCEDURE TNetFile.BlockWrite(VAR Buffer; Recs: Word);
  305.   BEGIN
  306.     CheckNetIo('BlockWrite');
  307.     System.BlockWrite(f, Buffer, Recs);
  308.     NetIo:=System.IoResult;
  309.   END;
  310.  
  311.   PROCEDURE TNetFile.WriteLine(s: String);
  312.   BEGIN
  313.     CheckNetIo('WriteLine');
  314.     s:=s+#13#10;
  315.     System.BlockWrite(f, s[1], Length(s));
  316.     NetIo:=System.IoResult;
  317.   END;
  318.  
  319.   FUNCTION TNetFile.FileSize: LongInt;
  320.   BEGIN
  321.     CheckNetIo('FileSize');
  322.     FileSize:=System.FileSize(f);
  323.     NetIo:=System.IoResult;
  324.   END;
  325.  
  326.   FUNCTION TNetFile.EoF: Boolean;
  327.   BEGIN
  328.     CheckNetIo('EoF');
  329.     EoF:=System.EoF(f);
  330.     NetIo:=System.IoResult;
  331.   END;
  332.  
  333.   FUNCTION TNetFile.FilePos: LongInt;
  334.   BEGIN
  335.     CheckNetIo('FilePos');
  336.     FilePos:=System.FilePos(f);
  337.     NetIo:=System.IoResult;
  338.   END;
  339.  
  340.   PROCEDURE TNetFile.Seek(RecNum: LongInt);
  341.   BEGIN
  342.     CheckNetIo('Seek');
  343.     System.Seek(f, RecNum);
  344.     NetIo:=System.IoResult;
  345.   END;
  346.  
  347.   PROCEDURE TNetFile.Truncate;
  348.   BEGIN
  349.     CheckNetIo('Truncate');
  350.     System.Truncate(f);
  351.     NetIo:=System.IoResult;
  352.   END;
  353.  
  354.   FUNCTION TNetFile.RecSize: Word;
  355.   BEGIN
  356.     CheckNetIo('RecSize');
  357.     RecSize:=FileRec(f).RecSize;
  358.   END;
  359.  
  360.   PROCEDURE TNetFile.CheckNetIo(CONST Where: S20);
  361.   BEGIN
  362.     IF NetIo<>0 THEN AddLog('!','Untrapped I/O Error '+Long2Str(NetIO)+' in TNetFile.'+Where+' of file: '+FName);
  363. {   NetIo:=0;}
  364.   END;
  365.  
  366. END.
  367.  
  368.